package ln.javatest.day18.demo01;

import java.lang.reflect.Field;

/*
java.lang.class
Class对象的功能：
  获取功能：
    1）获取成员变量们
        Field[]  getFields()：获取所有public修饰的成员变量
        Field  getField(String name)：获取指定名称的public修饰符的成员变量

        Field[] getDeclaredFields()：获取所有的成员变量，不考虑修饰符
        Field getDeclaredField(String name)：获取指定名称的成员变量不考虑修饰符
    2)获取构造方法们
        Constructor<?>[] getConstructors()
        Constructor<T> getConstructor(类<?>... parameterTypes)

        Constructor<?>[] getDeclaredConstructors()
        Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
    3）获取成员方法们
        method[] getMethods()
        method getMethod(String name, 类<?>... parameterTypes)

        method[] getDeclaredMethods()
        method getDeclaredMethod(String name, 类<?>... parameterTypes)
    4）获取类名
        String getName()
Field：成员变量
操作：
    设置值：void set(Object obj,Object value)
    获取值：get（Object obj)
*/
public class ReflectDemo2 {
    public static void main(String[] args) throws Exception {
        //1.先获取Person的class对象
        Class personClass = Person.class;

        //Field[]  getFields()：获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("================");
        // Field  getFields(String name)：获取指定名称的public修饰的成员变量
        Field ages = personClass.getField("age");
        //获取成员变成age的值
        Person p = new Person();
        Object value = ages.get(p);
        System.out.println(value);
        //设置age的值
        ages.set(p,10);
        Object value1 = ages.get(p);
        System.out.println(value1);
        System.out.println("===================");

        //Field[] getDeclaredFields():获取所有的成员变量，不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println("================");
        //Field getDeclaredField(String name)：获取指定名称的成员变量不考虑修饰符
        Field name = personClass.getDeclaredField("name");
        //忽略访问权限修饰符的安全检查
        name.setAccessible(true);
        Object value2 = name.get(p);
        System.out.println(value2);
    }
}
